/*
 进程和线程
   一个进程中，包含一到多个线程
   进程：一个程序（或者浏览器打开一个页卡，就是开辟一个进程）
   线程：干活的，一个程序中可能需要同时做多件事情，此时就需要开辟多个线程「一个线程同时只能干一件事情」

 同步编程：只有一个线程，所以同时只能干一件事情，只有当上一件事情处理完毕，下一件事情才能处理「线程有运行和空闲两个状态」
 异步编程：当前进程(程序)具备多个线程，可以同时处理多件事情，上一件事情即便没有处理完毕，也可以安排一个其它线程去处理，主线程可以继续向下执行！！

 浏览器是多线程的「每一次加载页面，浏览器都会分配很多线程，去同时做一些事情，以此来提高页面的渲染速度」
   GUI渲染线程：渲染和解析HTML/CSS的，以及最后绘制出相应的页面
   JS引擎线程「主线程」：渲染和解析JS代码的
   定时器监听线程：监听定时器的
   事件监听线程：监听DOM事件的
   HTTP网络请求线程：发送网络请求，从服务器获取资源的
   ...

 JS是单线程的：因为浏览器只分配了一个“JS引擎线程”去渲染解析JS
   + 在JS中大部分代码都是“同步代码”「例如：循环...」
   + 但是JS中也有“异步代码”
 */

/* setTimeout(() => {
  console.log(1);
}, 20);
console.log(2);
setTimeout(() => {
  console.log(3);
}, 10);
console.log(4);
for (let i = 0; i < 90000000; i++) {
  // do soming
}
console.log(5);
setTimeout(() => {
  console.log(6);
}, 8);
console.log(7);
setTimeout(() => {
  console.log(8);
}, 15);
console.log(9); */

/* console.log('start')
setTimeout(() => {
  console.log('定时器1')
  // while (1) { }
}, 0) //定时器等待时间设置为0，也不是让其立即执行，也需要等待「WebAPI->EventQueue」
console.log('handler....')
setTimeout(() => {
  console.log('定时器2')
}, 10)
// while (1) { } //死循环会让主线程一直被占用着，那么后续所有的事情（包括异步任务的执行都将处理不了了），真实项目中千万不要出现死循环
console.log('end') */